﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace WEB
{
    public partial class frmCompras : System.Web.UI.Page
    {
        [Dependency]
        public ICompraBL compraBL { get; set; }
        [Dependency]
        public IProductoBL insumoBL { get; set; }
        [Dependency]
        public IProveedorBL proveedorBL { get; set; }

        private const string KEYCOMPRA = "compra";

        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idCompra = Request.QueryString["id"];

            if (!Page.IsPostBack)
            {
                var nuevaCompra = new Compra()
                {
                    Fecha = DateTime.Now
                };
                BindingCompra(nuevaCompra);
                ViewState["opc"] = opc;
            }
            else if (opc !=null && opc=="editar" && idCompra !=null)
            {
                var compra = compraBL.GetFromComprasById(Int32.Parse(idCompra));
                BindingCompra(compra);
            }
        }
        public IQueryable<Producto> GetInsumos([Control("txtCriterio")] string criterio)
        {
            return insumoBL.GetFromProductosByCriterio(criterio).AsQueryable();
        }

        private void BindingCompra(Compra compra)
        {
            txtCodigo.Text = compra.Id.ToString();
            txtFecha.Text = compra.Fecha.ToShortDateString();

            if (compra.Proveedor!=null)
            {
                txtRuc.Text = compra.Proveedor.RucProvedor;
                txtCliente.Text = compra.Proveedor.NombreEmpresa;
                txtDireccion.Text = compra.Proveedor.DireccionProveedor;
            }
            compra.Total = compra.DetalleCompra.Sum(dp => dp.Monto);

            lvDetCompra.DataSource = compra.DetalleCompra;
            lvDetCompra.DataBind();

            var lblTotal = lvDetCompra.FindControl("lblTotal") as Label;

            if (lblTotal!=null)
            {
                lblTotal.Text = compra.Total.ToString();               
            }
            Cache.Insert(KEYCOMPRA,compra);

        }


        private Compra GetCompra()
        {
            return Cache.Get(KEYCOMPRA) as Compra;
        }

        protected void lvInsumos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName=="AddDetalle")
            {
                var insumoId = Int32.Parse(e.CommandArgument.ToString());

                var compra = GetCompra();

                var existe = compra.DetalleCompra
                    .Where(dp => dp.IdProducto == insumoId).SingleOrDefault();

                if (existe!=null)
                {
                    existe.Cantidad += 1;
                }
                else
                {
                    var insumo = insumoBL.GetFromProductosById(insumoId);

                    var newDetalle = new DetalleCompra()
                    {
                        IdCompra =  compra.Id,
                        IdProducto = insumo.Id,
                        Producto =insumo,
                        PrecioUnit = insumo.Precio,
                        Cantidad = 1
                    };
                    compra.DetalleCompra.Add(newDetalle);
                 }
                compra.Total = compra.DetalleCompra.Sum(i => i.Monto);
                BindingCompra(compra);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var compra = GetCompra();
            compra.Fecha = DateTime.Parse(txtFecha.Text);

            if (compra!=null)
            {
                if (ViewState["opc"].ToString().Equals("nuevo"))
                {
                    compraBL.AddCompra(compra);
                    ScriptManager.RegisterClientScriptBlock
                        (this, this.GetType(), "alertMessage", "alert('Compra Registrada..!!')", true);
                    Response.Redirect("frmListCompras.aspx");
                }
                else if (ViewState["opc"].ToString().Equals("editar"))
                {
                    compraBL.UpdateCompra(compra);
                }
            }

        }

        protected void lvDetCompra_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var idInsumo = Int32.Parse(e.CommandArgument.ToString());

                var compras = GetCompra();

                var detalle = compras.DetalleCompra
                    .Where(dp => dp
                        .IdProducto == idInsumo)
                        .SingleOrDefault();

                if (detalle != null)
                {
                    compras.DetalleCompra.Remove(detalle);
                }
                BindingCompra(compras);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var compra = GetCompra();

                foreach (var row in lvDetCompra.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPRecio") as TextBox;

                    compra.DetalleCompra.ToList()[row.DisplayIndex].Cantidad = decimal.Parse(txtCantidad.Text);
                    compra.DetalleCompra.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPrecio.Text);
                }
                BindingCompra(compra);
            }
        }

        protected void btnCargarProveedor_Click(object sender, EventArgs e)
        {
            var rucDni = txtRuc.Text;

            var proveedor = proveedorBL.GetFromProveedorByRuc(rucDni);

            var compra = Cache.Get(KEYCOMPRA) as Compra;

            if (proveedor==null)
            {
                txtRuc.Text = "";
                txtCliente.Text = "";
                compra.Proveedor = null;
            }
            else
            {
                //compra.IdProveedore = proveedor.id
                //compra.Proveedor = proveedor;

                Cache.Insert(KEYCOMPRA, compra);

                txtRuc.Text = compra.Proveedor.RucProvedor;
                txtCliente.Text = compra.Proveedor.NombreEmpresa;
                txtDireccion.Text = compra.Proveedor.DireccionProveedor;
                //lblMsgCliente.Text = "";
            }
        }
    }
}